﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Data.SqlClient;
using GRUPO_4.Dominio;
using System.Configuration;

namespace GRUPO_4.Persistencia
{
    public class PostulanteDao : IPostulanteDAO
    {
        public SqlConnection conexion;

        public PostulanteDao()
        {
            conexion = new SqlConnection();
            conexion.ConnectionString = ConfigurationManager.ConnectionStrings["cn"].ConnectionString;
        }

        public Postulante CrearPostulante(Postulante postulante)
        {

            String sentencia = "INSERT INTO Postulante VALUES (@codPostulante,@apePaternoPostulante,@apeMaternoPostulante,@nombre,@sexo,@FechaNacimiento,@numeroDocumento,@correo,@clave,@telefono,@ultimaEmpresa,@area,@cargo,@codProfesion)";
            conexion.Open();
            using (SqlCommand comando = new SqlCommand(sentencia, conexion))
            {
                SqlParameter codPostulante = new SqlParameter("@codPostulante", System.Data.SqlDbType.Int);
                codPostulante.Value = postulante.codPostulante;
                comando.Parameters.Add(codPostulante);

                SqlParameter apePaternoPostulante = new SqlParameter("@apePaternoPostulante", System.Data.SqlDbType.NVarChar);
                apePaternoPostulante.Value = postulante.apePaternoPostulante;
                comando.Parameters.Add(apePaternoPostulante);

                SqlParameter apeMaternoPostulante = new SqlParameter("@apeMaternoPostulante", System.Data.SqlDbType.NVarChar);
                apeMaternoPostulante.Value = postulante.apeMaternoPostulante;
                comando.Parameters.Add(apeMaternoPostulante);

                SqlParameter nombre = new SqlParameter("@nombre", System.Data.SqlDbType.NVarChar);
                nombre.Value = postulante.nombre;
                comando.Parameters.Add(nombre);

                SqlParameter sexo = new SqlParameter("@sexo", System.Data.SqlDbType.NChar);
                sexo.Value = postulante.sexo;
                comando.Parameters.Add(sexo);

                SqlParameter FechaNacimiento = new SqlParameter("@FechaNacimiento", System.Data.SqlDbType.DateTime);
                FechaNacimiento.Value = postulante.FechaNacimiento;
                comando.Parameters.Add(FechaNacimiento);

                SqlParameter numeroDocumento = new SqlParameter("@numeroDocumento", System.Data.SqlDbType.NVarChar);
                numeroDocumento.Value = postulante.numeroDocumento;
                comando.Parameters.Add(numeroDocumento);

                SqlParameter correo = new SqlParameter("@correo", System.Data.SqlDbType.NVarChar);
                correo.Value = postulante.correo;
                comando.Parameters.Add(correo);

                SqlParameter clave = new SqlParameter("@clave", System.Data.SqlDbType.NVarChar);
                clave.Value = postulante.clave;
                comando.Parameters.Add(clave);

                SqlParameter telefono = new SqlParameter("@telefono", System.Data.SqlDbType.NVarChar);
                telefono.Value = postulante.telefono;
                comando.Parameters.Add(telefono);

                SqlParameter ultimaEmpresa = new SqlParameter("@ultimaEmpresa", System.Data.SqlDbType.NVarChar);
                ultimaEmpresa.Value = postulante.ultimaEmpresa;
                comando.Parameters.Add(ultimaEmpresa);

                SqlParameter area = new SqlParameter("@area", System.Data.SqlDbType.NVarChar);
                area.Value = postulante.area;
                comando.Parameters.Add(area);

                SqlParameter cargo = new SqlParameter("@cargo", System.Data.SqlDbType.VarChar);
                cargo.Value = postulante.cargo;
                comando.Parameters.Add(cargo);

                SqlParameter codProfesion = new SqlParameter("@codProfesion", System.Data.SqlDbType.Int);
                codProfesion.Value = postulante.codProfesion;
                comando.Parameters.Add(codProfesion);

                comando.ExecuteNonQuery();
            }

            conexion.Close();
            return this.ObtenerPostulante(postulante.codPostulante);


        }

        public Postulante ModificarPostulante(Postulante objeto)
        {

            string fecha1 = objeto.FechaNacimiento.ToString("yyyy/MM/dd");


            conexion.Open();
            String sqlvalores1 = "apePaternoPostulante='" + objeto.apePaternoPostulante + "'" +
                                 ", apeMaternoPostulante='" + objeto.apeMaternoPostulante + "'" +
                                 ", nombre='" + objeto.nombre + "'" +
                                 ", sexo='" + objeto.sexo + "'" +
                                 ", fechaNacimiento=" + fecha1 +
                                 ", numeroDocumento='" + objeto.numeroDocumento + "'" +
                                 ", correo='" + objeto.correo + "'" +
                                 ", clave='" + fecha1 + "'" +
                                 ", ultimaEmpresa='" + objeto.ultimaEmpresa + "'" +
                                 ", area='" + objeto.area + "'" +
                                 ", cargo='" + objeto.cargo + "'" +
                                 ", codProfesion=" + objeto.codProfesion;


            String sentencia = "UPDATE Postulante SET " + sqlvalores1 + " WHERE codPostulante=" + objeto.codPostulante;
            SqlCommand comando = new SqlCommand(sentencia, conexion);

            comando.ExecuteNonQuery();
            conexion.Close();
            return this.ObtenerPostulante(objeto.codPostulante);

        }

        public Postulante ObtenerPostulante(int codigo)
        {

            String sentencia = "SELECT * FROM Postulante WHERE codPostulante=@codPostulante";
            this.conexion.Open();
            Postulante postulante = null;
            using (SqlCommand comando = new SqlCommand(sentencia, this.conexion))
            {
                SqlParameter buscador = new SqlParameter("@codPostulante", System.Data.SqlDbType.Int);
                buscador.Value = codigo;
                comando.Parameters.Add(buscador);
                SqlDataReader resultado = comando.ExecuteReader();
                if (resultado.HasRows)
                {
                    resultado.Read();
                    postulante = new Postulante();
                    postulante.codPostulante = (int)resultado["codPostulante"];

                    postulante.apePaternoPostulante = (String)resultado["apePaternoPostulante"];
                    postulante.apeMaternoPostulante = (String)resultado["apeMaternoPostulante"];
                    postulante.nombre = (String)resultado["nombre"];
                    postulante.sexo = (String)resultado["sexo"];
                    postulante.FechaNacimiento = (DateTime)resultado["fechaNacimiento"];
                    postulante.numeroDocumento = (String)resultado["numeroDocumento"];
                    postulante.correo = (String)resultado["correo"];
                    postulante.clave = (String)resultado["clave"];
                    postulante.telefono = (String)resultado["telefono"];
                    postulante.ultimaEmpresa = (String)resultado["ultimaEmpresa"];
                    postulante.area = (String)resultado["area"];
                    postulante.cargo = (String)resultado["cargo"];
                    postulante.codProfesion = (int)resultado["codProfesion"];

                }

            }

            conexion.Close();
            return postulante;
        }

        public void eliminarPostulante(int codigo)
        {
            String sentencia = "DELETE FROM Postulante WHERE codPostulante=@codPostulante";
            this.conexion.Open();
            using (SqlCommand comando = new SqlCommand(sentencia, this.conexion))
            {
                SqlParameter borrador = new SqlParameter("@codPostulante", System.Data.SqlDbType.Int);
                borrador.Value = codigo;
                comando.Parameters.Add(borrador);
                comando.ExecuteNonQuery();

            }
            this.conexion.Close();

        }


        public ICollection<Postulante> ListarTodos()
        {
            conexion.Open();

            String sentencia = "SELECT * FROM Postulante";

            SqlCommand comando = new SqlCommand(sentencia, conexion);

            SqlDataReader resultado = comando.ExecuteReader();

            //Se declara la coleccion de Postulante --- Coleccion es un contenedor de objetos de tipo Postulante

            ICollection<Postulante> objColeccionPostulante = new List<Postulante>();

            while (resultado.Read())
            {

                Postulante unPostulante = new Postulante();

                unPostulante.codPostulante = (int)resultado["codPostulante"];

                unPostulante.apePaternoPostulante = (String)resultado["apePaternoPostulante"];
                unPostulante.apeMaternoPostulante = (String)resultado["apeMaternoPostulante"];
                unPostulante.nombre = (String)resultado["nombre"];
                unPostulante.sexo = (String)resultado["sexo"];
                unPostulante.FechaNacimiento = (DateTime)resultado["FechaNacimiento"];
                unPostulante.numeroDocumento = (String)resultado["numeroDocumento"];
                unPostulante.correo = (String)resultado["correo"];
                unPostulante.clave = (String)resultado["clave"];
                unPostulante.telefono = (String)resultado["telefono"];
                unPostulante.ultimaEmpresa = (String)resultado["ultimaEmpresa"];
                unPostulante.area = (String)resultado["area"];
                unPostulante.cargo = (String)resultado["cargo"];
                unPostulante.codProfesion = (int)resultado["CodProfesion"];
            
                
                objColeccionPostulante.Add(unPostulante);
                }
            conexion.Close();
            return objColeccionPostulante;

        }
            
        public ICollection<Postulante> ListarPorNombreSimilar(string nombre)
        {
            throw new NotImplementedException();
        }

        public Postulante Crear(Postulante entidad)
        {
            return this.CrearPostulante(entidad);
        }

        public Postulante Obtener(int id)
        {
            return this.ObtenerPostulante(id);
        }

        public Postulante Modificar(Postulante entidad)
        {
            return this.ModificarPostulante(entidad);
        }

        public void Eliminar(Postulante entidad)
        {
            this.eliminarPostulante(entidad.codPostulante);
        }
    }
}